package com.jingdianjichi.subject.infra.rpc.util;

import com.jingdianjichi.subject.infra.rpc.context.LoginContextHolder;

/**
 * 登录用户信息工具类
 * 
 * 该工具类为业务代码提供简洁的用户信息获取接口，
 * 封装了ThreadLocal的复杂性，使业务代码更加清晰。
 * 
 * 主要功能：
 * 1. 获取当前登录用户ID
 * 2. 检查用户登录状态
 * 3. 获取必须登录的用户ID（未登录抛异常）
 * 
 * 使用场景：
 * - Controller层获取当前用户信息
 * - Service层进行用户相关业务处理
 * - 权限校验和数据过滤
 * 
 * 设计原则：
 * - 提供多种获取方式适应不同场景
 * - 方法命名清晰表达意图
 * - 异常处理明确且有意义
 * - 静态方法便于使用
 * 
 * 注意事项：
 * - 只能在HTTP请求线程中使用
 * - 异步处理中需要手动传递用户信息
 * - 在拦截器执行前调用会返回null
 *
 * @author: CodeBuddy
 * @date: 2025/9/19
 */
public class LoginUtil {
    
    /**
     * 获取当前登录用户ID
     * 
     * 这是最基础的用户信息获取方法，适用于大多数场景。
     * 如果用户未登录或在非HTTP请求线程中调用，返回null。
     * 
     * 使用示例：
     * <pre>
     * String loginId = LoginUtil.getLoginId();
     * if (loginId != null) {
     *     // 处理已登录用户的逻辑
     * } else {
     *     // 处理未登录的情况
     * }
     * </pre>
     * 
     * @return 用户ID，如果未登录则返回null
     */
    public static String getLoginId() {
        return LoginContextHolder.getLoginId();
    }
    
    /**
     * 检查当前是否已登录
     * 
     * 便捷方法，用于快速检查用户登录状态。
     * 相比直接判断getLoginId()是否为null，语义更清晰。
     * 
     * 使用示例：
     * <pre>
     * if (LoginUtil.isLogin()) {
     *     // 用户已登录的处理逻辑
     * } else {
     *     // 用户未登录的处理逻辑
     * }
     * </pre>
     * 
     * @return true-已登录，false-未登录
     */
    public static boolean isLogin() {
        return LoginContextHolder.hasLoginId();
    }
    
    /**
     * 获取当前登录用户ID，如果未登录则抛出异常
     * 
     * 适用于必须要求用户登录的业务场景。
     * 如果用户未登录，会抛出运行时异常，调用方需要处理异常。
     * 
     * 使用示例：
     * <pre>
     * try {
     *     String loginId = LoginUtil.getLoginIdRequired();
     *     // 处理已登录用户的逻辑
     * } catch (RuntimeException e) {
     *     // 处理用户未登录的异常
     * }
     * </pre>
     * 
     * @return 用户ID，保证不为null
     * @throws RuntimeException 如果用户未登录
     */
    public static String getLoginIdRequired() {
        String loginId = LoginContextHolder.getLoginId();
        if (loginId == null) {
            throw new RuntimeException("用户未登录，请先登录后再访问");
        }
        return loginId;
    }
    
    /**
     * 获取当前登录用户ID，如果未登录则返回默认值
     * 
     * 适用于需要提供默认值的场景，避免null值处理。
     * 
     * 使用示例：
     * <pre>
     * String loginId = LoginUtil.getLoginIdOrDefault("anonymous");
     * // loginId保证不为null，未登录时为"anonymous"
     * </pre>
     * 
     * @param defaultValue 默认值，当用户未登录时返回
     * @return 用户ID或默认值
     */
    public static String getLoginIdOrDefault(String defaultValue) {
        String loginId = LoginContextHolder.getLoginId();
        return loginId != null ? loginId : defaultValue;
    }
}